package fr.uniscol.siecle.parsers;

import java.io.File;
import java.util.Iterator;

import org.jdom2.Document;
import org.jdom2.Element;

import fr.uniscol.siecle.model.Division;
import fr.uniscol.siecle.model.Eleve;
import fr.uniscol.siecle.model.Eleves;
import fr.uniscol.siecle.model.FichierSIECLE;
import fr.uniscol.siecle.model.Groupe;
import fr.uniscol.siecle.model.MEF;
import fr.uniscol.siecle.model.Matiere;
import fr.uniscol.siecle.model.ModaliteElection;
import fr.uniscol.siecle.model.MotifSortie;
import fr.uniscol.siecle.model.Option;
import fr.uniscol.siecle.model.Provenance;
import fr.uniscol.siecle.model.StructureEleve;

public class FichierSIECLEElevesParser extends IFichierSIECLEParser {

	@Override
	public FichierSIECLE buildModel(Document doc, ParsingResults results) {
		
		Eleves model = new Eleves();
		
		Element eDonnees = doc.getRootElement().getChild("DONNEES");
		Element eEleves = eDonnees.getChild("ELEVES");
		Element eOptions = eDonnees.getChild("OPTIONS");
		Element eStructures = eDonnees.getChild("STRUCTURES");
		
		Iterator<Element> ite = eEleves.getChildren().iterator();
		Element eEleve = null;
		Eleve e = null;
		while(ite.hasNext()){
			eEleve = ite.next();
			
			e = new Eleve();
			e.setId(eEleve.getAttributeValue("ELEVE_ID"));
			e.setElenoet(eEleve.getAttributeValue("ELENOET"));
			e.setId_national(eEleve.getChildText("ID_NATIONAL"));
			e.setId_eleve_etab(eEleve.getChildText("ID_ELEVE_ETAB"));
			e.setNom(eEleve.getChildText("NOM"));
			e.setPrenom(eEleve.getChildText("PRENOM"));
			e.setDate_naissance(eEleve.getChildText("DATE_NAISS"));
			e.setDoublement(eEleve.getChildText("DOUBLEMENT"));
			e.setCode_pays(eEleve.getChildText("CODE_PAYS"));
			e.setAccepte_sms(eEleve.getChildText("ACCEPTE_SMS"));
			e.setDate_modification(eEleve.getChildText("DATE_MODIFICATION"));
			e.setDate_sortie(eEleve.getChildText("DATE_SORTIE"));
			e.setRegime(eEleve.getChildText("CODE_REGIME"));
			e.setDate_entree(eEleve.getChildText("DATE_ENTREE"));
			e.setVille_naissance(eEleve.getChildText("VILLE_NAISS"));
			e.setMotifSortie(new MotifSortie());
			e.getMotifSortie().setCode(eEleve.getChildText("CODE_MOTIF_SORTIE"));
			e.setCode_sexe(eEleve.getChildText("CODE_SEXE"));
			e.setCode_pays_nat(eEleve.getChildText("CODE_PAYS_NAT"));
			e.setAdhesion_transport(eEleve.getChildText("ADHESION_TRANSPORT"));
			e.setProvenance(new Provenance());
			e.getProvenance().setCode(eEleve.getChildText("CODE_PROVENANCE"));
			e.setMef(new MEF());
			e.getMef().setCode(eEleve.getChildText("CODE_MEF"));
			
			// Scolarité an dernier
			
			model.getEleves().add(e);
		}
		
		Iterator<Element> ito = null;
		ite = eOptions.getChildren().iterator();
		Element eOpt = null, eOpts = null;
		Option opt = null;
		while(ite.hasNext()){
			eOpt = ite.next();
			
			e = model.findEleve(eOpt.getAttributeValue("ELEVE_ID"));
			if(e != null){
				for(Element o : eOpt.getChildren()){
					opt = new Option();
					opt.setEleve(e);
					opt.setMatiere(new Matiere());
					opt.getMatiere().setCode(o.getChildText("CODE_MATIERE"));
					opt.setModalite(new ModaliteElection());
					opt.getModalite().setCode(o.getChildText("CODE_MODALITE_ELECT").trim());
					opt.setNum_option(o.getChildText("NUM_OPTION"));
					
					e.getOptions().add(opt);
				}
			}
		}
		
		ite = eStructures.getChildren().iterator();
		Element eSts = null;
		Element eSt = null;
		Division st = null;
		StructureEleve se = null;
		while(ite.hasNext()){
			eSt = ite.next();
			
			e = model.findEleve(eSt.getAttributeValue("ELEVE_ID"));
			if(e != null){
				for(Element s : eSt.getChildren("STRUCTURE")){
					if(s.getChildText("TYPE_STRUCTURE").equals("D")){
						st = new Division();
					}else{
						st = new Groupe();
					}
					st.setCode(s.getChildText("CODE_STRUCTURE"));
					
					e.getStructures().add(st);
					
					se = new StructureEleve();
					se.setEleve(e);
					se.setStructure(st);
					se.setType_structure(s.getChildText("TYPE_STRUCTURE"));
					
					model.getStructuresEleve().add(se);
				}
			}
		}
		
		return model;
	}
}
